package ${package}.${moduleName}.degrade;

import ${package}.${bottomName}.dto.req.${className}StoreReq;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.rainbow.common.core.entity.Result;
import com.rainbow.common.core.error.GlobalException;
import lombok.extern.slf4j.Slf4j;
import com.alibaba.fastjson.JSON;

/**
* ${classname}服务熔断降级处理
* ${comments}
* @author ${author}
* 邮箱  ${email}
* @date ${datetime}
*/
@Slf4j
public class ${className}ClientDegrade{

    /**
    * 保存数据熔断处理
    *  注意:
    *  1.返回值类型和原函数必须类型一致
    *  2.方法参数列表需要和原函数一致,可以额外多一个BlockException,可以区分是什么规则的处理方法
    *  3.block默认跟处理类在同一类中,如果希望统一处理，可以使用其他类的函数,可以指定fallBack对应的类
    *  降级处理,遇到seata通过feign调用时,需要全局回滚,此时根据具体处理方案处理自己的数据问题此时,可以throw new GlobalException("熔断处理");
    *  降级处理,调用链起始服务时,需要直接响应处理结果,可以自行处理,直接抛出异常或者其他处理方式需要自己针对性处理咯。
    * @param entity 参数
    * @return 保存熔断处理结果
    */
    public static Result insertOnBlock(${className}StoreReq entity,BlockException e) {
        log.error("${comments}创建失败,熔断处理 入参:{},class:{},error:{}",JSON.toJSONString(entity),e.getClass().getCanonicalName(),e.getMessage());
        throw new GlobalException("${comments}创建失败,熔断处理");
    }

    /**
    * 保存数据降级处理
    * @param entity 参数
    * @return 保存降级处理结果
    */
    public static Result insertOnFallBack(${className}StoreReq entity,Throwable e) {
        log.error("${comments}创建失败,降级处理 入参:{},class:{},error:{}",JSON.toJSONString(entity),e.getClass().getCanonicalName(),e.getMessage());
        return Result.success(null);
    }


    /**
    * 更新数据熔断处理
    *  注意:
    *  1.返回值类型和原函数必须类型一致
    *  2.方法参数列表需要和原函数一致,可以额外多一个BlockException,可以区分是什么规则的处理方法
    *  3.block默认跟处理类在同一类中,如果希望统一处理，可以使用其他类的函数,可以指定fallBack对应的类
    *  降级处理,遇到seata通过feign调用时,需要全局回滚,此时根据具体处理方案处理自己的数据问题此时,可以throw new GlobalException("熔断处理");
    *  降级处理,调用链起始服务时,需要直接响应处理结果,可以自行处理,直接抛出异常或者其他处理方式需要自己针对性处理咯。
    * @param entity 参数
    * @return 保存熔断处理结果
    */
    public static Result updateOnBlock(${className}StoreReq entity,BlockException e) {
        log.error("${comments}更新失败,熔断处理 入参:{},class:{},error:{}",JSON.toJSONString(entity),e.getClass().getCanonicalName(),e.getMessage());
        throw new GlobalException("${comments}更新失败,熔断处理");
    }

    /**
    * 更新数据降级处理
    * @param entity 参数
    * @return 更新降级处理结果
    */
    public static Result updateOnFallBack(${className}StoreReq entity,Throwable e) {
        log.error("${comments}更新失败,降级处理 入参:{},class:{},error:{}",JSON.toJSONString(entity),e.getClass().getCanonicalName(),e.getMessage());
        return Result.success(null);
    }

}
